package main

import "fmt"

//例：寻找最长不含有重复字符的子串
// 假设子串为start到x所在位置的子串，start表示当前不含有子串的开始位置
// lastOccurred[x]表示最后一次出现过x的位置下标
// 如果lastOccurred[x]出现的位置在start前面,不需要管，因为统计的是start向后到x位置的子串
// 如果lastOccurred[x]出现的在start到x位置之间，那么需要更新start，start=lastOccurred[x]+1
func lengthOfNonRepeatingSubStr(s string) int {
	// 创建一个map用于记录s字符串，key为s切割后字符，value为位置信息
	lastOccurred := make(map[rune]int)
	start := 0
	maxLength := 0
	// []rune(s)表示s字符串转成rune数组
	for i, ch := range []rune(s) {
		// 如果lastOccurred[ch]不存在，返回的是0，也就是false,lastI表示位置信息，ok表示是否找到该值
		if lastI, ok := lastOccurred[ch]; ok && lastI >= start {
			start = lastI + 1
		}
		if i-start+1 > maxLength {
			maxLength = i - start + 1
		}
		// 相当于put操作
		lastOccurred[ch] = i
	}
	return maxLength
}

func main() {
	fmt.Println(lengthOfNonRepeatingSubStr("abcabcbb"))
	fmt.Println(lengthOfNonRepeatingSubStr("bbbbb"))
	fmt.Println(lengthOfNonRepeatingSubStr("pwwkew"))
	fmt.Println(lengthOfNonRepeatingSubStr(""))
	fmt.Println(lengthOfNonRepeatingSubStr("b"))
	fmt.Println(lengthOfNonRepeatingSubStr("abcdef"))
	fmt.Println(lengthOfNonRepeatingSubStr("这里是慕课网"))
	fmt.Println(lengthOfNonRepeatingSubStr("一二三二一"))
}
